Scroll to navigation

SUBPAGE_PROT(2) Руководство программиста Linux SUBPAGE_PROT(2)

ИМЯ

subpage_prot - определяет подстраничную защиту адресного диапазона

ОБЗОР

long subpage_prot(unsigned long addr, unsigned long len,
                  uint32_t *map);

ОПИСАНИЕ

Системный вызов (есть только для PowerPC) subpage_prot() предоставляет возможность контроля доступа к отдельным 4КБ подстраницам в системах, где размер страницы равен 64КБ.

Карта защиты налагается на страницы памяти для области, начинающейся с addr и имеющей размер len байт. Значения обоих аргументов должны быть выровнены на 64-КБ границу.

Карта защиты задаётся в буфере, на который указывает map. В карте на каждую 4-килобайтную подстраницу выделяется 2 бита; таким образом, в каждом 32-битном слове задаётся защита для 16 4-килобайтных подстраниц внутри 64-килобайтной страницы (поэтому количество 32-битных слов, на которые указывает map, должно быть равно количеству 64-килобайтных страниц, указанному в len). Каждое 2-битное поле в карте защиты может быть: 0 — полный доступ, 1 — защита от записи, 2 или 3 — запрет на любой доступ.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении subpage_prot() возвращается 0. В противном случае возвращается один из кодов ошибок, описанных далее.

ОШИБКИ

Буфер, на который ссылается map, недоступен.
Некорректное значение аргумента addr или len. Оба значения должны быть кратны размеру системной страницы, и они не должны указывать на область вне адресного пространства процесса, или на область, которая состоит из огромных страниц.
Не хватает памяти.

ВЕРСИИ

Данный системный вызов предоставляется для архитектуры PowerPC начиная с Linux 2.6.25. Для его сборки в ядре должен быть указан параметр CONFIG_PPC_64K_PAGES. В библиотеке поддержка данного вызова отсутствует.

СООТВЕТСТВИЕ СТАНДАРТАМ

Данный вызов есть только в Linux.

ЗАМЕЧАНИЯ

Обычная страничная защита также работает (на уровне 64-килобайтных страниц); механизм подстраничной защиты является дополнительным ограничением, поэтому указание 0 в 2-битном поле не разрешит запись в страницу, которая защищена от записи другим способом.

Обоснование

Данный системный вызов предоставляется для облегчения написания эмуляторов, которые работают с 64-КБ страницами в системах PowerPC. При эмуляции систем, в которых используется меньший размер страницы (таких как x86), эмулятор не может использовать блок управления памятью (MMU) и обычные системные вызовы управления защитой страниц (эмулятор может эмулировать MMU с помощью ПО проверяя и, возможно, перераспределяя адрес при каждом обращении к памяти, но это медленно). Идея в том, что эмулятор задаёт массив защитных масок для указанного диапазона виртуальных адресов. Эти маски накладываются в месте, где аппаратные табличные записи страниц (PTE) вставляются в аппаратную таблицу страниц на основе Linux PTE, при этом Linux PTE не затрагиваются. В этом случае для защищённых областей адресного пространства начинают неявно использоваться 4-килобайтные аппаратные страницы, а не 64-килобайтные аппаратные страницы (на машинах с аппаратной поддержкой 64-килобайтных страниц).

СМОТРИТЕ ТАКЖЕ

mprotect(2), syscall(2);
Файл из дерева исходного кода ядра Documentation/vm/hugetlbpage.txt.

2010-10-30 Linux